package com.woyowodaows.request;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.support.v4.content.FileProvider;
import android.util.Log;
import android.view.View;


import com.lzy.okgo.OkGo;
import com.lzy.okgo.cache.CacheMode;
import com.lzy.okgo.callback.StringCallback;
import com.lzy.okgo.model.Response;
import com.woyowodaows.R;
import com.woyowodaows.activity.home.LoginActivity;
import com.woyowodaows.base.BaseBean;
import com.woyowodaows.dialog.DownloadApkDialog;
import com.woyowodaows.dialog.ProgressBarDialog;
import com.woyowodaows.download.DownloadDbHelper;
import com.woyowodaows.download.DownloadTaskUtils;
import com.woyowodaows.download.DownloaderMangerUtils;
import com.woyowodaows.download.FileInfoBean;
import com.woyowodaows.download.OnProgressListener;
import com.woyowodaows.utils.ActivityManagerUtils;
import com.woyowodaows.utils.LoginJudge;
import com.woyowodaows.utils.MD5Utils;
import com.woyowodaows.utils.SPUtils;
import com.woyowodaows.utils.ToastUtil;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author haiwei
 *         网络请求
 */
public class HttpAsyncTask {

    private static HttpAsyncTask apiAsyncTask;
    /**
     * 业务异常
     */
    public static final int SUCCESS = 0;
    public static int REQUEST_STATE = 0;
    public static int REQUEST_RESULT = 0;
    public ProgressBarDialog progressBarDialog;
    public static boolean IS_LOGIN = false;

    public static HttpAsyncTask getInstance() {
        if (apiAsyncTask == null) {
            synchronized (HttpAsyncTask.class) {
                if (apiAsyncTask == null) {
                    apiAsyncTask = new HttpAsyncTask();
                }
            }
        }
        return apiAsyncTask;
    }

    /**
     * 退出登录
     *
     * @param baseBean
     * @param context
     */
    private boolean exitLogin(Context context, BaseBean baseBean) {
        if (baseBean != null) {
            if (baseBean.getResult() == 110) {
                ActivityManagerUtils.getInstance().finishAllActivity();
                LoginJudge.clearData();
                ToastUtil.show(context, "用户登录已过期,请重新登录");
                LoginJudge.isLogin(context, LoginActivity.class, null);
                return true;
            }
        }
        return false;
    }


    /**
     * 隐藏dialog
     */
    public void dismissDialog() {
        if (progressBarDialog != null) {
            progressBarDialog.dismissDialog();
            progressBarDialog = null;

        }
    }

    /**
     * 显示dialog
     *
     * @param context
     * @param promptInfo
     */
    public void showDialog(boolean isShowDialog, Context context, String promptInfo) {
        if (isShowDialog) {
            if (progressBarDialog == null) {
                progressBarDialog = new ProgressBarDialog(context, promptInfo);
            } else {
                progressBarDialog.setContentText(promptInfo);
            }
            progressBarDialog.showDialog();
        }
    }

    private DownloaderMangerUtils downLoader = null;
    private FileInfoBean info;
    private DownloadApkDialog downloadApkDialog;
    /**
     * 下载安装apk
     *
     * @param context
     * @param url
     */
    public void downloadApk(final Context context, final String url) {
        downloadApkDialog = new DownloadApkDialog(context);
        downloadApkDialog.dialog_button_cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                downloadApkDialog.hideDialog();
                downLoader.stop(url);
            }
        });
        downloadApkDialog.showDialog();
        DownloadDbHelper helper = new DownloadDbHelper(context);
        downLoader = DownloaderMangerUtils.getInstance(helper, new OnProgressListener() {
            @Override
            public void updateProgress(int max, int progress) {
                downloadApkDialog.pb_download.setMax(max);
                downloadApkDialog.pb_download.setProgress(progress);
                if (progress == max) {
                    downloadApkDialog.pb_download.setReachedBarColor(context.getResources().getColor(R.color.colorAccent));
                    downloadApkDialog.pb_download.setProgressTextColor(context.getResources().getColor(R.color.colorAccent));
                    File file = DownloadTaskUtils.file;
                    downloadApkDialog.hideDialog();
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                        Uri contentUri = FileProvider.getUriForFile(context, "com.woyowodaows.fileprovider", file);
                        intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
                        context.startActivity(intent);
                    } else {
                        intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        context.startActivity(intent);
                    }

                }
            }
        });
        info = new FileInfoBean("com.woyowodaows.apk", url);
        downLoader.addTask(info);
        downLoader.restart(info.getUrl());
    }


    /**
     * Post Json 请求
     *
     * @param context
     * @param promptInfo         提示信息
     * @param isShowDialog       是否显示提示框
     * @param url                接口地址
     * @param
     * @param apiRequestListener
     */
    public void onPostParamJson(final Context context, String promptInfo, final boolean isShowDialog, String url, final Class<?> mClass, String params, final HttpRequestListener apiRequestListener) {
        showDialog(isShowDialog, context, promptInfo);
        OkGo.<String>post(url)    // 请求方式和请求url, get请求不需要拼接参数，支持get，post，put，delete，icon_head_photo，options请求
                .tag(context)               // 请求的 tag, 主要用于取消对应的请求
                .isMultipart(false)       // 强制使用 multipart/form-data 表单上传（只是演示，不需的话不要设置。默认就是false）
                .cacheTime(5000)         // 缓存的过期时间,单位毫秒
                .headers("Jwt",(String) SPUtils.get(context,SPUtils.REQUEST_HEAD_JWT,""))//添加请求头
//                .headers("userId",(String) SPUtils.get(context,SPUtils.USER_ID,""))//添加用户ID
                .cacheMode(CacheMode.FIRST_CACHE_THEN_REQUEST) // 缓存模式，详细请看第四部分，缓存介绍
                .params("param", params)//这里给出的泛型为 ServerModel，同时传递一个泛型的 class对象，即可自动将数据结果转成对象返回
                .execute(new StringCallback() {
                    @Override
                    public void onSuccess(Response<String> response) {
                        requestSuccess(context, isShowDialog, response.body().toString(), response.headers().get("Jwt"), mClass, apiRequestListener);
                    }

                    @Override
                    public void onError(Response<String> response) {
                        super.onError(response);
                        requestError(context, isShowDialog, response, apiRequestListener);
                    }

                });

    }


    /**
     * 多文件上传
     *
     * @param files
     */
    public void onPostListFile(final Context context, String promptInfo, final boolean isShowDialog, List<File> files, String url, final Class<?> mClass, final HttpRequestListener apiRequestListener) {
        showDialog(isShowDialog, context, promptInfo);
        OkGo.<String>post(url)    // 请求方式和请求url, get请求不需要拼接参数，支持get，post，put，delete，icon_head_photo，options请求
                .tag(context)               // 请求的 tag, 主要用于取消对应的请求
                .isMultipart(true)       // 强制使用 multipart/form-data 表单上传（只是演示，不需要的话不要设置。默认就是false）
                .addFileParams("file", files) // 这里支持一个key传多个文件
                .headers("Jwt",(String) SPUtils.get(context,SPUtils.REQUEST_HEAD_JWT,""))//添加请求头
//                .headers("userId",(String) SPUtils.get(context,SPUtils.USER_ID,""))//添加用户ID
                .execute(new StringCallback() {
                    @Override
                    public void onSuccess(Response<String> response) {
                        requestSuccess(context, isShowDialog, response.body().toString(), response.headers().get("Jwt"), mClass, apiRequestListener);
                    }

                    @Override
                    public void onError(Response<String> response) {
                        super.onError(response);
                        requestError(context, isShowDialog, response, apiRequestListener);
                    }
                });

    }


    /**
     * 单独文件上传
     *
     * @param files
     */
    public void onPostFile(final Context context, String promptInfo, final boolean isShowDialog, String url, File files, final Class<?> mClass, final HttpRequestListener apiRequestListener) {
        showDialog(isShowDialog, context, promptInfo);
        OkGo.<String>post(url)    // 请求方式和请求url, get请求不需要拼接参数，支持get，post，put，delete，icon_head_photo，options请求
                .tag(context)               // 请求的 tag, 主要用于取消对应的请求
                .isMultipart(true)       // 强制使用 multipart/form-data 表单上传（只是演示，不需要的话不要设置。默认就是false）
                .params("file", files)   // 可以添加文件上传
                .execute(new StringCallback() {
                    @Override
                    public void onSuccess(Response<String> response) {
                        requestSuccess(context, isShowDialog, response.body().toString(), response.headers().get("Jwt"), mClass, apiRequestListener);
                    }

                    @Override
                    public void onError(Response<String> response) {
                        super.onError(response);
                        requestError(context, isShowDialog, response, apiRequestListener);
                    }
                });

    }


    /**
     * onGet请求
     *
     * @param context
     * @param promptInfo         提示信息
     * @param isShowDialog       是否显示提示框
     * @param url                接口地址
     * @param requestParams
     * @param apiRequestListener
     */
    public void onGet(final Context context, String promptInfo, final boolean isShowDialog, String url, final Class<?> mClass, Map<String, Object> requestParams, final HttpRequestListener apiRequestListener) {
        showDialog(isShowDialog, context, promptInfo);
        String params = ApiRequestFactory.getRequestMapParams(context, requestParams);
        OkGo.<String>get(url)
                .tag(context)
                .cacheTime(5000)
                .headers("Jwt",(String) SPUtils.get(context,SPUtils.REQUEST_HEAD_JWT,""))//添加请求头
                .cacheMode(CacheMode.FIRST_CACHE_THEN_REQUEST)
                .params("param", params)
                .execute(new StringCallback() {
                    @Override
                    public void onSuccess(Response<String> response) {
                        requestSuccess(context, isShowDialog, response.body().toString(), response.headers().get("Jwt"), mClass, apiRequestListener);
                    }

                    @Override
                    public void onError(Response<String> response) {
                        requestError(context, isShowDialog, response, apiRequestListener);
                    }


                });
    }


    /**
     * onGet请求
     *
     * @param context
     * @param promptInfo         提示信息
     * @param isShowDialog       是否显示提示框
     * @param url                接口地址
     * @param apiRequestListener
     */
    public void onGet(final Context context, String promptInfo, final boolean isShowDialog, String url, final Class<?> mClass, final HttpRequestListener apiRequestListener) {
        showDialog(isShowDialog, context, promptInfo);
        OkGo.<String>get(url)
                .tag(context)
                .cacheTime(5000)
                .headers("Jwt",(String) SPUtils.get(context,SPUtils.REQUEST_HEAD_JWT,""))//添加请求头
                .cacheMode(CacheMode.FIRST_CACHE_THEN_REQUEST)
                .execute(new StringCallback() {
                    @Override
                    public void onSuccess(Response<String> response) {
                        Log.d("打印数据----log",response.toString()+"jwt---"+response.headers().get("Jwt"));
                        requestSuccess(context, isShowDialog, response.body().toString(), response.headers().get("Jwt"), mClass, apiRequestListener);
                    }

                    @Override
                    public void onError(Response<String> response) {
                        requestError(context, isShowDialog, response, apiRequestListener);
                    }


                });
    }


    /**
     * Post请求
     *
     * @param context
     * @param promptInfo         提示信息
     * @param isShowDialog       是否显示提示框
     * @param url                接口地址
     * @param apiRequestListener
     */
    public void onPostParam(final Context context, String promptInfo, final boolean isShowDialog, String url, final Class<?> mClass, final Map<String, Object> requestParams, final HttpRequestListener apiRequestListener) {
        String version = Build.VERSION.SDK_INT + "";
        showDialog(isShowDialog, context, promptInfo);
        //appId=41beed5fd5344ccf8eadf8e4fbdccf13
        requestParams.put("appId",InterfaceUrl.APP_ID);
        requestParams.put("wsflag",InterfaceUrl.WSFLAG);
        requestParams.put("t",System.currentTimeMillis());
        requestParams.put("version",version);
        requestParams.put("sign",MD5Utils.createSign(requestParams));

        Map<String,String> param=new HashMap<>();
        for (String key:requestParams.keySet()) {
            param.put(key,requestParams.get(key)+"");
        }

//        String params = ApiRequestFactory.getRequestMapParams(context, requestParams);

        String jwt = (String) SPUtils.get(context,SPUtils.REQUEST_HEAD_JWT,"");
        OkGo.<String>post(url)    // 请求方式和请求url, get请求不需要拼接参数，支持get，post，put，delete，icon_head_photo，options请求
                .tag(context)               // 请求的 tag, 主要用于取消对应的请 求
                .headers("Jwt",jwt)//添加请求头
//                .params("param", params)//这里给出的泛型为 ServerModel，同时传递一个泛型的 class对象，即可自动将数据结果转成对象返回
                .params(param,false)
                .cacheTime(6000)
                .execute(new StringCallback() {
                    @Override
                    public void onSuccess(Response<String> response) {
                        Log.d("打印数据----log",response.toString()+"jwt---"+response.headers().get("Jwt"));
                        requestSuccess(context, isShowDialog, response.body().toString(), response.headers().get("Jwt"), mClass, apiRequestListener);
                    }

                    @Override
                    public void onError(Response<String> response) {
                        super.onError(response);
                        requestError(context, isShowDialog, response, apiRequestListener);
                    }
                });
    }

    /**
     * 加密请求
     *
     * @param context
     * @param promptInfo         提示信息
     * @param isShowDialog       是否显示提示框
     * @param url                接口地址
     * @param apiRequestListener
     */
    public void onPostParamEncrypt(final Context context, String promptInfo, final boolean isShowDialog, String url, final Class<?> mClass, final Map<String, Object> requestParams, final HttpRequestListener apiRequestListener) {
        showDialog(isShowDialog, context, promptInfo);
        String params = ApiRequestFactory.getRequestMapParams(context, requestParams);
        byte[] encryptResultStr = new byte[0];
        try {
//            encryptResultStr = BackAES.encrypt(params, Constant.skey, 0);
        } catch (Exception e) {
            e.printStackTrace();
        }
        String param = new String(encryptResultStr);
        OkGo.<String>post(url)    // 请求方式和请求url, get请求不需要拼接参数，支持get，post，put，delete，icon_head_photo，options请求
                .tag(context)               // 请求的 tag, 主要用于取消对应的请求
                .headers("ploy", "encrypt")//添加请求头
                .headers("Jwt",(String) SPUtils.get(context,SPUtils.REQUEST_HEAD_JWT,""))//添加请求头
                .params("param", param)//这里给出的泛型为 ServerModel，同时传递一个泛型的 class对象，即可自动将数据结果转成对象返回
                .cacheTime(6000)
                .execute(new StringCallback() {
                    @Override
                    public void onSuccess(Response<String> response) {
                        Log.e("", "请求得到的数据===========" + response.body().toString());
                        requestSuccess(context, isShowDialog, response.body().toString(), response.headers().get("Jwt"), mClass, apiRequestListener);
                    }

                    @Override
                    public void onError(Response<String> response) {
                        super.onError(response);
                        requestError(context, isShowDialog, response, apiRequestListener);
                    }
                });
    }


    /**
     * onGet请求
     *
     * @param context
     * @param promptInfo         提示信息
     * @param isShowDialog       是否显示提示框
     * @param url                接口地址
     * @param requestParams
     * @param apiRequestListener
     */
    public void onGetParam(final Context context, String promptInfo, final boolean isShowDialog, String url, final Class<?> mClass, Map<String, Object> requestParams, final HttpRequestListener apiRequestListener) {
        showDialog(isShowDialog, context, promptInfo);
        String params = ApiRequestFactory.getRequestMapParams(context, requestParams);
        OkGo.<String>get(url)
                .tag(context)
                .cacheTime(5000)
                .headers("Jwt",(String) SPUtils.get(context,SPUtils.REQUEST_HEAD_JWT,""))//添加请求头
                .cacheMode(CacheMode.FIRST_CACHE_THEN_REQUEST)
                .params("param", params)
                .execute(new StringCallback() {
                    @Override
                    public void onSuccess(Response<String> response) {
                        requestSuccess(context, isShowDialog, response.body().toString(), response.headers().get("Jwt"), mClass, apiRequestListener);
                    }

                    @Override
                    public void onError(Response<String> response) {
                        requestError(context, isShowDialog, response, apiRequestListener);
                    }

                });
    }


    /**
     * 请求成功回调
     *
     * @param context
     * @param json
     * @param apiRequestListener
     * @param mClass
     */
    private void requestSuccess(Context context, boolean isShowDialog, String json, String head, Class<?> mClass, HttpRequestListener apiRequestListener) {
        if (apiRequestListener == null) {
            return;
        }
        if (context instanceof Activity && ((Activity) context).isFinishing()) {
            return;
        }
        if (IS_LOGIN) {
            SPUtils.put(context,SPUtils.REQUEST_HEAD_JWT,head);
        }
        IS_LOGIN = false;
        if (json != null) {
            Object resultObject = ApiResponsFactory.onReponseWithResult(mClass, json);
            BaseBean bean = (BaseBean) ApiResponsFactory.onReponseWithResult(BaseBean.class, json);
            //判断是否是登录状态
            boolean isExitLogin = exitLogin(context, bean);
            if (!isExitLogin) {
                if (resultObject != null) {
                    apiRequestListener.onSuccess(resultObject);
                } else {
                    String message = null;
                    if (bean != null) {
                        REQUEST_STATE = bean.getState();
                        REQUEST_RESULT = bean.getState();
                        message = bean.getMessage();
                    }
                    apiRequestListener.onError(message + "");
                }
            }
        } else {
            apiRequestListener.onError("获取数据失败");
        }
        if (isShowDialog) {
            dismissDialog();
        }
    }

    /**
     * 请求失败回调
     *
     * @param context
     * @param apiRequestListener
     */
    private void requestError(Context context, boolean isShowDialog, Response response, HttpRequestListener apiRequestListener) {
        if (isShowDialog) {
            dismissDialog();
        }
        if (apiRequestListener == null) {
            return;
        }

        if (context instanceof Activity && ((Activity) context).isFinishing()) {
            return;
        }
        IS_LOGIN = false;
        String errorCodes;
        if (response.getRawResponse() == null) {
            errorCodes = "网络异常，请检查网络设置";
        } else {
            switch (response.getRawResponse().code()) {
                case 500:
                    errorCodes = "服务器异常500";
                    break;
                case 502:
                    errorCodes = "服务器异常502";
                    break;
                case 408:
                    errorCodes = "请求超时,请稍后重试";
                    break;
                case 404:
                    errorCodes = "请求地址错误";
                    break;
                case 400:
                    errorCodes = "客户端参数不正确";
                    break;
                case 503:
                    errorCodes = "请求超时,请稍后重试";
                    break;
                default:
                    errorCodes = "请求超时,请稍后重试";
                    break;
            }
        }
        apiRequestListener.onError(errorCodes);
    }

    /**
     *  多文件上传
     * @param files
     */
    public void  onPostListVidoFile(final Context context, String promptInfo, final boolean isShowDialog, List<File> files, final Class<?> mClass, final HttpRequestListener apiRequestListener){
        showDialog(isShowDialog, context, promptInfo);
        OkGo.<String>post(InterfaceUrl.UPLOAD)    // 请求方式和请求url, get请求不需要拼接参数，支持get，post，put，delete，icon_head_photo，options请求
                .tag(context)               // 请求的 tag, 主要用于取消对应的请求
                .isMultipart(true)       // 强制使用 multipart/form-data 表单上传（只是演示，不需要的话不要设置。默认就是false）
                .addFileParams("file",  files) // 这里支持一个key传多个文件
                .headers("Jwt",(String) SPUtils.get(context,SPUtils.REQUEST_HEAD_JWT,""))//添加请求头
                .execute(new StringCallback() {
                    @Override
                    public void onSuccess(Response<String> response) {
                        Log.e("","请求得到的数据===图片"+InterfaceUrl.UPLOAD+"========"+response.body().toString());
                        requestSuccess(context, isShowDialog, response.body().toString(),response.headers().get("Jwt"), mClass, apiRequestListener);
                    }

                    @Override
                    public void onError(Response<String> response) {
                        super.onError(response);
                        requestError(context, isShowDialog, response, apiRequestListener);
                    }
                });

    }
    /**
     *  单独文件上传
     * @param files
     */
    public void  onPostFile(final Context context, String promptInfo, final boolean isShowDialog, File files,final Map<String, Object> requestParams,final Class<?> mClass, final HttpRequestListener apiRequestListener){
        showDialog(isShowDialog, context, promptInfo);
//        String version = Build.VERSION.SDK_INT + "";
//        showDialog(isShowDialog, context, promptInfo);
//        requestParams.put("appId",InterfaceUrl.APP_ID);
//        requestParams.put("wsflag",InterfaceUrl.WSFLAG);
//        requestParams.put("t",System.currentTimeMillis());
//        requestParams.put("version",version);
//        requestParams.put("sign",MD5Utils.createSign(requestParams));
//
//        Map<String,String> param=new HashMap<>();
//        for (String key:requestParams.keySet()) {
//            param.put(key,requestParams.get(key)+"");
//        }

        OkGo.<String>post(InterfaceUrl.IMAGE_URL)    // 请求方式和请求url, get请求不需要拼接参数，支持get，post，put，delete，icon_head_photo，options请求
                .tag(context)               // 请求的 tag, 主要用于取消对应的请求
                .isMultipart(true)       // 强制使用 multipart/form-data 表单上传（只是演示，不需要的话不要设置。默认就是false）
                .params("file",files)   // 可以添加文件上传
//                .params(param,false)
                .headers("Jwt",(String) SPUtils.get(context,SPUtils.REQUEST_HEAD_JWT,""))//添加请求头
               // .headers("userId",(String) SPUtils.get(context,SPUtils.USER_ID,""))//添加用户ID
                .execute(new StringCallback() {
                    @Override
                    public void onSuccess(Response<String> response) {
                        requestSuccess(context, isShowDialog, response.body().toString(),response.headers().get("Jwt"), mClass, apiRequestListener);
                    }

                    @Override
                    public void onError(Response<String> response) {
                        super.onError(response);
                        requestError(context, isShowDialog, response, apiRequestListener);
                    }
                });

    }






}